﻿using System.Data;

namespace PomodoroSuite.FW.Comun.Apoyo
{
    public enum TipoFiltro
    {
        And,
        Or
    }

    public enum Operacion
    {
        Igual,
        NoIgual,
        MayorIgual,
        MenorIgual,
        Mayor,
        Menor,
        Like
    }

    public enum TipoValor
    {
        Cadena,
        Numero,
        Fecha,
        Booleano
    }

    public class Filtro
    {
        #region " Constructor "

        /// <summary>
        /// Constructor. Por defecto OperacionLogica = Igual; FiltroConcatenacion = And
        /// </summary>
        public Filtro()
        {
            OperacionLogica = Operacion.Igual;
            FiltroConcatenacion = TipoFiltro.And;
        }

        /// <summary>
        /// Constructor. Por defecto OperacionLogica = Igual; FiltroConcatenacion = And
        /// </summary>
        /// <param name="nombreCampo"></param>
        /// <param name="operacion"></param>
        /// <param name="valor"></param>
        public Filtro(string nombreCampo, object valor)
        {
            NombreCampo = nombreCampo;
            NombreVariable = nombreCampo;
            OperacionLogica = Operacion.Igual;
            Valor = valor;
            FiltroConcatenacion = TipoFiltro.And;
            ValorTipo = TipoValor.Numero;
            TipoBD = DbType.Object;
        }

        public Filtro(string nombreCampo, object valor, TipoValor valorTipo)
        {
            NombreCampo = nombreCampo;
            NombreVariable = nombreCampo;
            OperacionLogica = Operacion.Igual;
            Valor = valor;
            FiltroConcatenacion = TipoFiltro.And;
            ValorTipo = valorTipo;
            switch (valorTipo)
            {
                case TipoValor.Cadena:
                    TipoBD = DbType.String;
                    break;
                case TipoValor.Numero:
                    TipoBD = DbType.Int32;
                    break;
                case TipoValor.Fecha:
                    TipoBD = DbType.DateTime;
                    break;
                case TipoValor.Booleano:
                    TipoBD = DbType.Boolean;
                    break;
                default:
                    break;
            }
        }

        /// <summary>
        /// Constructor. Por defecto la propiedad FiltroConcatenacion = And
        /// </summary>
        /// <param name="nombreCampo"></param>
        /// <param name="operacion"></param>
        /// <param name="valor"></param>
        public Filtro(string nombreCampo, Operacion operacion, object valor)
        {
            NombreCampo = nombreCampo;
            NombreVariable = nombreCampo;
            OperacionLogica = operacion;
            Valor = valor;
            FiltroConcatenacion = TipoFiltro.And;
            ValorTipo = TipoValor.Numero;
            TipoBD = DbType.Object;
        }

        public Filtro(string nombreCampo, Operacion operacion, object valor, TipoFiltro tipoFiltro)
        {
            NombreCampo = nombreCampo;
            NombreVariable = nombreCampo;
            OperacionLogica = operacion;
            Valor = valor;
            FiltroConcatenacion = tipoFiltro;
            ValorTipo = TipoValor.Numero;
            TipoBD = DbType.Object;
        }

        public Filtro(string nombreCampo, Operacion operacion, object valor, TipoFiltro tipoFiltro, TipoValor valorTipo)
        {
            NombreCampo = nombreCampo;
            NombreVariable = nombreCampo;
            OperacionLogica = operacion;
            Valor = valor;
            FiltroConcatenacion = tipoFiltro;
            ValorTipo = valorTipo;
            switch (valorTipo)
            {
                case TipoValor.Cadena:
                    TipoBD = DbType.String;
                    break;
                case TipoValor.Numero:
                    TipoBD = DbType.Int32;
                    break;
                case TipoValor.Fecha:
                    TipoBD = DbType.DateTime;
                    break;
                case TipoValor.Booleano:
                    TipoBD = DbType.Boolean;
                    break;
                default:
                    break;
            }
        }

        public Filtro(string nombreCampo, Operacion operacion, object valor, TipoFiltro tipoFiltro, TipoValor valorTipo, DbType tipoBD)
        {
            NombreCampo = nombreCampo;
            NombreVariable = nombreCampo;
            OperacionLogica = operacion;
            Valor = valor;
            FiltroConcatenacion = tipoFiltro;
            ValorTipo = valorTipo;
            TipoBD = tipoBD;
        }

        #endregion

        #region " Propiedades "

        public string NombreCampo { get; set; }

        public Operacion OperacionLogica { get; set; }

        public object Valor { get; set; }

        public TipoFiltro FiltroConcatenacion { get; set; }

        public TipoValor ValorTipo { get; set; }

        public DbType? TipoBD { get; set; }

        public string NombreVariable
        {
            get { return nombreVariable; }
            set
            {
                if (value.IndexOf('@') == -1)
                    nombreVariable = value;
            }
        }

        #endregion

        #region " Campos "

        private string nombreVariable;

        #endregion
    }
}

